package com.peng.scalatest

//scala是包作用域的  ，  类和文件名不需要一致， 实际会把每个一个object和class都编译成一个个单独的class文件，
// 因此，一个包内不能出现两个相同名称的object，或两个相同名称的class
object HelloWorld {
  private var person: Person = new Person(233)
  var a: Int = _ //_代表的是某一类型的默认值. (前提必须是变量var 不能是val) 且只有成员变量可以这样赋值，局部变量不可以
  println("helloworld before")

  def main(args: Array[String]): Unit = {
    println("hello world2！")
    person.printMsg()


    println(a)
  }

  println("helloworld after")

}

//只有类构造方法参数可以加前缀是var（变量）类型还是val（常量）的 ；  方法参数默认都为val （常量），且不能加前缀
//类构造方法声明后，将替代默认无参构造，此后该类的初始化不再有无参构造，且其他构造的第一步也将从调用无参构造改为必须调用该构造
//类构造方法的参数赋值后，才会执行裸露代码块的内容， 可将该值二次赋值，
// 通过类构造方法传入的参数这种语法糖，实际是生成了一个private修饰的类型的成员变量,这个变量是不是常量由构造参数是var还是val决定
class Person(var age: String) {

  var num: Int = 3
  //scala中，裸露代码自动算入无参构造器， 且在scala中，不用用户自己定义无参构造方法（也不能）
  //其他带参构造器，第一步必须调用无参构造器  也就是this（）
  age = "heiheihei"

  def this(num: Int) {
    this("haha")
    printMsg()
  }

  println(s"person $num")

  def printMsg(): Unit = {
    age = "qqq"
    println(s"printMsg~~~$age")

  }

  println(s"person ${num + 1}")
  println(s"person ${age}")
  println(Person.name)
}

//scala在使用object下的成员变量属性的时候，需要通过 object名.属性名
//object的实质上一个单例类
//当一个object和一个class同名时，会产生一个关联关系，使得在class里可以访问同名object里的私有属性
object Person {
  private var name = "我是黑色"
}



